package com.briup.day18;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;

public class Homework {
    public static void main(String[] args) {
        HashMap<Integer, Student> map = new HashMap<>();
        // ctrl+alt+鼠标左键，可以同时自定义选中多行代码，可以对其进行操作
        map.put(1, new Student("tom", 80));
        map.put(2, new Student("mike", 90));
        map.put(3, new Student("lily", 90.5));
        map.put(4, new Student("chris", 89.5));

        // 遍历map集合，map集合不能直接使用迭代器以及foreach进行遍历
        // 但是可以通过entrySet()方法获取到维护了key和value映射的单列集合，
        // 然后对该单列集合可以进行遍历
        Set<Map.Entry<Integer, Student>> entries = map.entrySet();
        for (Map.Entry<Integer, Student> entry : entries) {
            System.out.println(entry.getKey() + "====" + entry.getValue());
        }

        System.out.println("---------------------------------------");

        // 也可以通过 keySet()方法，获取map集合中所有key的集合
        Set<Integer> integers = map.keySet();
        for (Integer integer : integers) {
            // 遍历时，可以根据key获取到value值
            System.out.println(integer+"======"+map.get(integer));
        }

        // 通过values()方法，也可以获取存储了map集合中所有value值的单列集合
    }

    private static void test() {
        // Math类中存在一个方法floor，会返回小于你传入数据的最大整数
        int a = (int) Math.floor(30.1);
        System.out.println(a);

        TreeSet<Student> set = new TreeSet<>();
        Student student1 = new Student("tom", 80);
        Student student2 = new Student("mike", 90);
        Student student3 = new Student("lily", 90.5);
        Student student4 = new Student("chris", 89.5);
        set.add(student3);
        set.add(student2);
        set.add(student1);
        set.add(student4);
        System.out.println(set);
    }
}


@Data
@AllArgsConstructor
@NoArgsConstructor
class Student implements Comparable<Student> {
    private String name;
    private double score;

    @Override
    public int compareTo(Student o) {
        if ("tom".equals(this.name)) {
            // 这里的-1表示 this - o < 0 恒成立，
            // 即表示this如果叫tom，o不叫tom的话，this始终在o对象的最左边；
            // 而TreeSet中使用的是红黑树结构，其次在遍历改红黑树时，
            // 使用的是中序遍历，即左中右，即从最左边的元素开始遍历
            return "tom".equals(o.name) ? (int) ((o.score - this.score) * 10) : -1;
        } else {
            return "tom".equals(o.name) ? 1 : (int) ((o.score - this.score) * 10);
        }
    }
}